{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## chap12 Pandas数据处理开源库\n",
    "### 1 安装并使用Pandas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import seaborn as sns\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'1.0.5'"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.__version__"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'1.18.5'"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.__version__"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<method-wrapper '__init__' of module object at 0x000001CD072B69A0>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.__init__"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# pd?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2 Pandas数值运算方法\n",
    "### 一个简单的 Series 和 DataFrame 来演示：\n",
    "#### [RandomState 和 RandomSeed](https://zhuanlan.zhihu.com/p/66507920)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    6\n",
       "1    3\n",
       "2    7\n",
       "3    4\n",
       "dtype: int32"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rng = np.random.RandomState(42)\n",
    "ser = pd.Series(rng.randint(0, 10, 4)) #四个元素\n",
    "ser"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>9</td>\n",
       "      <td>2</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>4</td>\n",
       "      <td>3</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>7</td>\n",
       "      <td>2</td>\n",
       "      <td>5</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   A  B  C  D\n",
       "0  6  9  2  6\n",
       "1  7  4  3  7\n",
       "2  7  2  5  4"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame(rng.randint(0, 10, (3, 4)) # 随机产生0--10之间的12个数，组成3x4矩阵\n",
    "columns = ['A', 'B', 'C', 'D'])\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 如果对这两个对象的其中一个使用 NumPy 通用函数，生成的结果是另一个保留索引的 Pandas 对象："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    6\n",
       "1    3\n",
       "2    7\n",
       "3    4\n",
       "dtype: int32"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ser"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### np.exp(B) : 求e的幂次方、np.sqrt(B):求B的开方"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0     403.428793\n",
       "1      20.085537\n",
       "2    1096.633158\n",
       "3      54.598150\n",
       "dtype: float64"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.exp(ser)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 或者，再做一个比较复杂的运算："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-1.000000</td>\n",
       "      <td>7.071068e-01</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>-1.000000e+00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.707107</td>\n",
       "      <td>1.224647e-16</td>\n",
       "      <td>0.707107</td>\n",
       "      <td>-7.071068e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.707107</td>\n",
       "      <td>1.000000e+00</td>\n",
       "      <td>-0.707107</td>\n",
       "      <td>1.224647e-16</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          A             B         C             D\n",
       "0 -1.000000  7.071068e-01  1.000000 -1.000000e+00\n",
       "1 -0.707107  1.224647e-16  0.707107 -7.071068e-01\n",
       "2 -0.707107  1.000000e+00 -0.707107  1.224647e-16"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.sin(df * np.pi / 4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Series索引对齐\n",
    "### 例子，假如你要整合两个数据源的数据，\n",
    "#### 其中一个是美国面积最大的三个州的面积数据，另一个是美国人口最多的三个州的人口数据："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Alaska        1723337\n",
       "Texas          695662\n",
       "California     423967\n",
       "Name: area, dtype: int64"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "area = pd.Series({'Alaska': 1723337, 'Texas': 695662,'California': 423967}, name='area')\n",
    "area"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "California    38332521\n",
       "Texas         26448193\n",
       "New York      19651127\n",
       "Name: population, dtype: int64"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "population = pd.Series({'California': 38332521, 'Texas': 26448193,'New York': 19651127}, name='population')\n",
    "population"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 用人口除以面积会得到什么样的结果："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Alaska              NaN\n",
       "California    90.413926\n",
       "New York            NaN\n",
       "Texas         38.018740\n",
       "dtype: float64"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "population / area"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Python 标准库的集合运算法则来获得这个索引："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['Texas', 'California'], dtype='object')"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "area.index & population.index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['Alaska', 'California', 'New York', 'Texas'], dtype='object')"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "area.index | population.index"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 对于缺失位置的数据，Pandas 会用 NaN 填充，表示“此处无数”。\n",
    "#### 这种索引对齐方式是通过 Python 内置的集合运算规则实现的，任何缺失值默认都用 NaN 填充："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    2\n",
       "1    4\n",
       "2    6\n",
       "dtype: int64"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A = pd.Series([2, 4, 6], index=[0, 1, 2])\n",
    "A"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1    1\n",
       "2    3\n",
       "3    5\n",
       "dtype: int64"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "B = pd.Series([1, 3, 5], index=[1, 2, 3])\n",
    "B"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 公共部分相加，索引对齐"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    NaN\n",
       "1    5.0\n",
       "2    9.0\n",
       "3    NaN\n",
       "dtype: float64"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A + B"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 例如，A.add(B) 等价于 A + B，也可以设置参数自定义 A 或 B 缺失的数据："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    2.0\n",
       "1    5.0\n",
       "2    9.0\n",
       "3    5.0\n",
       "dtype: float64"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A.add(B, fill_value=0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## DataFrame索引对齐"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   A   B\n",
       "0  1  11\n",
       "1  5   1"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A = pd.DataFrame(rng.randint(0, 20, (2, 2)),columns=list('AB'))\n",
    "A"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### [python pandas stack和unstack函数](https://www.cnblogs.com/bambipai/p/7658311.html)\n",
    "> 　表格在行列方向上均有索引（类似于DataFrame），花括号结构只有“列方向”上的索引（类似于层次化的Series），结构更加偏向于堆叠（Series-stack，方便记忆）。stack函数会将数据从”表格结构“变成”花括号结构“，即将其行索引变成列索引，反之，unstack函数将数据从”花括号结构“变成”表格结构“，即要将其中一层的列索引变成行索引。例："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0  A     1\n",
       "   B    11\n",
       "1  A     5\n",
       "   B     1\n",
       "dtype: int32"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "series_stack = A.stack()\n",
    "series_stack"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4.5"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A.stack().mean() #"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   A   B\n",
       "0  1  11\n",
       "1  5   1"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "series_stack.unstack()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>B</th>\n",
       "      <th>A</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>3</td>\n",
       "      <td>8</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>4</td>\n",
       "      <td>8</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   B  A  C\n",
       "0  3  8  2\n",
       "1  4  2  6\n",
       "2  4  8  6"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "B = pd.DataFrame(rng.randint(0, 10, (3, 3)), columns=list('BAC'))\n",
    "B"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>9.0</td>\n",
       "      <td>14.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A     B   C\n",
       "0  9.0  14.0 NaN\n",
       "1  7.0   5.0 NaN\n",
       "2  NaN   NaN NaN"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A + B"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 这里，我们将用A 中所有值的均值来填充缺失值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4.5"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fill = A.stack().mean()\n",
    "fill"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>9.0</td>\n",
       "      <td>14.0</td>\n",
       "      <td>6.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>10.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>12.5</td>\n",
       "      <td>8.5</td>\n",
       "      <td>10.5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      A     B     C\n",
       "0   9.0  14.0   6.5\n",
       "1   7.0   5.0  10.5\n",
       "2  12.5   8.5  10.5"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A.add(B, fill_value=fill)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 通用函数：DataFrame与Series的运算\n",
    "### 让一个二维数组减去自身的一行数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 3, 8, 1],\n",
       "       [9, 8, 9, 4],\n",
       "       [1, 3, 6, 7]])"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A = rng.randint(10, size=(3, 4))\n",
    "A"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 3, 8, 1])"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0,  0,  0,  0],\n",
       "       [ 8,  5,  1,  3],\n",
       "       [ 0,  0, -2,  6]])"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A - A[0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#在 Pandas 里默认也是按行运算的："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Q</th>\n",
       "      <th>R</th>\n",
       "      <th>S</th>\n",
       "      <th>T</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>8</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>9</td>\n",
       "      <td>8</td>\n",
       "      <td>9</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>6</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Q  R  S  T\n",
       "0  1  3  8  1\n",
       "1  9  8  9  4\n",
       "2  1  3  6  7"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame(A, columns=list('QRST'))\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Q</th>\n",
       "      <th>R</th>\n",
       "      <th>S</th>\n",
       "      <th>T</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>8</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-2</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Q  R  S  T\n",
       "0  0  0  0  0\n",
       "1  8  5  1  3\n",
       "2  0  0 -2  6"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df - df.iloc[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Q</th>\n",
       "      <th>R</th>\n",
       "      <th>S</th>\n",
       "      <th>T</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>8</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-2</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Q  R  S  T\n",
       "0  0  0  0  0\n",
       "1  8  5  1  3\n",
       "2  0  0 -2  6"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df- df.loc[0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 如果你想按列计算，那么就需要利用前面介绍过的运算符方法，通过 axis 参数设置："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Q</th>\n",
       "      <th>R</th>\n",
       "      <th>S</th>\n",
       "      <th>T</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>8</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>9</td>\n",
       "      <td>8</td>\n",
       "      <td>9</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>6</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Q  R  S  T\n",
       "0  1  3  8  1\n",
       "1  9  8  9  4\n",
       "2  1  3  6  7"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    3\n",
       "1    8\n",
       "2    3\n",
       "Name: R, dtype: int32"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[\"R\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Q</th>\n",
       "      <th>R</th>\n",
       "      <th>S</th>\n",
       "      <th>T</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-2</td>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "      <td>-2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>-4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-2</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Q  R  S  T\n",
       "0 -2  0  5 -2\n",
       "1  1  0  1 -4\n",
       "2 -2  0  3  4"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.subtract(df['R'], axis=0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 你会发现 DataFrame / Series 的运算与前面介绍的运算一样，结果的索引都会自动对齐："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Q</th>\n",
       "      <th>R</th>\n",
       "      <th>S</th>\n",
       "      <th>T</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>8</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>9</td>\n",
       "      <td>8</td>\n",
       "      <td>9</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>6</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Q  R  S  T\n",
       "0  1  3  8  1\n",
       "1  9  8  9  4\n",
       "2  1  3  6  7"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Q    1\n",
       "S    8\n",
       "Name: 0, dtype: int32"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "halfrow = df.iloc[0, ::2]\n",
    "halfrow"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Q</th>\n",
       "      <th>R</th>\n",
       "      <th>S</th>\n",
       "      <th>T</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>8</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>9</td>\n",
       "      <td>8</td>\n",
       "      <td>9</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>6</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Q  R  S  T\n",
       "0  1  3  8  1\n",
       "1  9  8  9  4\n",
       "2  1  3  6  7"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 按列相减"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Q    1\n",
       "S    8\n",
       "Name: 0, dtype: int32"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "halfrow"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Q</th>\n",
       "      <th>R</th>\n",
       "      <th>S</th>\n",
       "      <th>T</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>8.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>-2.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     Q   R    S   T\n",
       "0  0.0 NaN  0.0 NaN\n",
       "1  8.0 NaN  1.0 NaN\n",
       "2  0.0 NaN -2.0 NaN"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df - halfrow "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## 3 处理缺失值\n",
    "### 1) None：Python对象类型的缺失值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "NoneType"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, None, 3, 4], dtype=object)"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vals1 = np.array([1, None, 3, 4])\n",
    "vals1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dtype = object\n",
      "dtype = int\n"
     ]
    }
   ],
   "source": [
    "for dt in ['object', 'int']:\n",
    "    print(\"dtype =\", dt)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#vals1.sum()\n",
    "##　TypeError Traceback (\n",
    "#这就是说，在 Python 中没有定义整数与 None 之间的加法运算。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2) NaN：数值类型的缺失值 \n",
    "- `NaN`是浮点数类型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dtype('float64')"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vals2 = np.array([1, np.nan, 3, 4])\n",
    "vals2.dtype"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "nan"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "1 + np.nan"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "nan"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "0 * np.nan"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "nan"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vals2.sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1., nan,  3.,  4.])"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vals2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "nan"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vals2.min()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "nan"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vals2.max()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### NumPy 也提供了一些特殊的累计函数，它们可以忽略缺失值的影响："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1., nan,  3.,  4.])"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vals2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "8.0"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.nansum(vals2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.0"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.nanmin(vals2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4.0"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.nanmax(vals2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3) Pandas中NaN与None的差异\n",
    "- Pandas 会将没有标签值的数据类型自动转换为 NAN。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    1.0\n",
       "1    NaN\n",
       "2    2.0\n",
       "3    NaN\n",
       "dtype: float64"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.Series([1, np.nan, 2, None])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    0\n",
       "1    1\n",
       "dtype: int32"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = pd.Series(range(2), dtype=int)\n",
    "x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    NaN\n",
       "1    1.0\n",
       "dtype: float64"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x[0] = None\n",
    "x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "float"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(np.NaN)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "float"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(np.nan)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## 4) 处理缺失值\n",
    "\n",
    "### Pandas 数据结构有两种有效的方法可以发现缺失值：isnull() 和 notnull()。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = pd.Series([1, np.nan, 'hello', None])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    False\n",
       "1     True\n",
       "2    False\n",
       "3     True\n",
       "dtype: bool"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.isnull()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 布尔类型掩码数组，可以直接作为 Series 或 DataFrame 的索引使用，起到过滤的作用："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0        1\n",
       "2    hello\n",
       "dtype: object"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data[data.notnull()]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 剔除缺失值\n",
    "#### 在 Series 上使用这些方法非常简单："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0        1\n",
       "2    hello\n",
       "dtype: object"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.dropna()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 而在 DataFrame 上使用它们时需要设置一些参数，例如下面的 DataFrame："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>NaN</td>\n",
       "      <td>4.0</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     0    1  2\n",
       "0  1.0  NaN  2\n",
       "1  2.0  3.0  5\n",
       "2  NaN  4.0  6"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame([[1, np.nan, 2], [2, 3, 5], [np.nan, 4, 6]])\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 默认下，dropna() 会剔除任何包含缺失值的整行数据："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     0    1  2\n",
       "1  2.0  3.0  5"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.dropna()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 可以设置按不同的坐标轴剔除缺失值，比如 axis=1(或 axis='columns')会剔除任何包含缺失值的整列数据："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   2\n",
       "0  2\n",
       "1  5\n",
       "2  6"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.dropna(axis='columns')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 设置 `how='all'`·，只剔除全部是缺失值的行或列了：\n",
    "- how 可以取 \"all\", \"any\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 增加一列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>NaN</td>\n",
       "      <td>4.0</td>\n",
       "      <td>6</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     0    1  2   3\n",
       "0  1.0  NaN  2 NaN\n",
       "1  2.0  3.0  5 NaN\n",
       "2  NaN  4.0  6 NaN"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[3] = np.nan\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>NaN</td>\n",
       "      <td>4.0</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     0    1  2\n",
       "0  1.0  NaN  2\n",
       "1  2.0  3.0  5\n",
       "2  NaN  4.0  6"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.dropna(axis='columns', how=\"all\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 还可以通过 thresh 参数设置行或列中非缺失值的最小数量，从而实现更加个性化的配置："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>NaN</td>\n",
       "      <td>4.0</td>\n",
       "      <td>6</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     0    1  2   3\n",
       "0  1.0  NaN  2 NaN\n",
       "1  2.0  3.0  5 NaN\n",
       "2  NaN  4.0  6 NaN"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     0    1  2   3\n",
       "1  2.0  3.0  5 NaN"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.dropna(axis='rows', thresh=3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 填充缺失值\n",
    "#### Pandas 为此专门提供了一个fillna() 方法，它将返回填充了缺失值后的数组副本。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a    1.0\n",
       "b    NaN\n",
       "c    2.0\n",
       "d    NaN\n",
       "e    3.0\n",
       "dtype: float64"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = pd.Series([1, np.nan, 2, None, 3], index=list('abcde'))\n",
    "data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 我们将用一个单独的值来填充缺失值，例如用 0："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a    1.0\n",
       "b    0.0\n",
       "c    2.0\n",
       "d    0.0\n",
       "e    3.0\n",
       "dtype: float64"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.fillna(0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 可用缺失值前面的有效值来从前往后填充(forward-fill)\n",
    "#### 从前往后填充"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a    1.0\n",
       "b    1.0\n",
       "c    2.0\n",
       "d    2.0\n",
       "e    3.0\n",
       "dtype: float64"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.fillna(method='ffill')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 也可用缺失值后面的有效值来从后往前填充(back-fill)\n",
    "##### 从后往前填充"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a    1.0\n",
       "b    2.0\n",
       "c    2.0\n",
       "d    3.0\n",
       "e    3.0\n",
       "dtype: float64"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.fillna(method='bfill')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### DataFrame 的操作方法与 Series 类似，只是在填充时需要设置坐标轴参数 axis："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>NaN</td>\n",
       "      <td>4.0</td>\n",
       "      <td>6</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     0    1  2   3\n",
       "0  1.0  NaN  2 NaN\n",
       "1  2.0  3.0  5 NaN\n",
       "2  NaN  4.0  6 NaN"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>NaN</td>\n",
       "      <td>4.0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     0    1    2    3\n",
       "0  1.0  1.0  2.0  2.0\n",
       "1  2.0  3.0  5.0  5.0\n",
       "2  NaN  4.0  6.0  6.0"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.fillna(method='ffill', axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>6</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     0    1  2   3\n",
       "0  1.0  NaN  2 NaN\n",
       "1  2.0  3.0  5 NaN\n",
       "2  2.0  4.0  6 NaN"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.fillna(method=\"ffill\", axis=0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## 4 合并数据集"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "### 简单起见，定义一个能够创建 DataFrame 某种形式的函数，后面将会用到：\n",
    "\n",
    "#### 一个简单的创建DataFrame函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'A': ['A0', 'A1', 'A2'], 'B': ['B0', 'B1', 'B2'], 'C': ['C0', 'C1', 'C2']}"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cols = 'ABC'\n",
    "ind = range(3)\n",
    "{c: [str(c) + str(i) for i in ind] for c in cols} #字典推导式"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [],
   "source": [
    "def make_df(cols, ind):\n",
    "    data = {c: [str(c) + str(i) for i in ind] for c in cols}\n",
    "    return pd.DataFrame(data, ind)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>A0</td>\n",
       "      <td>B0</td>\n",
       "      <td>C0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>A1</td>\n",
       "      <td>B1</td>\n",
       "      <td>C1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>A2</td>\n",
       "      <td>B2</td>\n",
       "      <td>C2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    A   B   C\n",
       "0  A0  B0  C0\n",
       "1  A1  B1  C1\n",
       "2  A2  B2  C2"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# DataFrame示例\n",
    "make_df('ABC', range(3))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1) pd.concat实现合并\n",
    "### pd.concat() 可以简单地合并一维的 Series 或 DataFrame 对象\n",
    "### 与 np.concatenate()合并数组一样："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1    A\n",
       "2    B\n",
       "3    C\n",
       "dtype: object"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ser1 = pd.Series(['A', 'B', 'C'], index=[1, 2, 3])\n",
    "ser1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4    D\n",
       "5    E\n",
       "6    F\n",
       "dtype: object"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ser2 = pd.Series(['D', 'E', 'F'], index=[4, 5, 6])\n",
    "ser2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1    A\n",
       "2    B\n",
       "3    C\n",
       "4    D\n",
       "5    E\n",
       "6    F\n",
       "dtype: object"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.concat([ser1, ser2])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 它也可以用来合并高维数据，例如下面的 DataFrame："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>A1</td>\n",
       "      <td>B1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>A2</td>\n",
       "      <td>B2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    A   B\n",
       "1  A1  B1\n",
       "2  A2  B2"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1 = make_df('AB', [1, 2])\n",
    "\n",
    "df2 = make_df('AB', [3, 4])\n",
    "\n",
    "df1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>A3</td>\n",
       "      <td>B3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>A4</td>\n",
       "      <td>B4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    A   B\n",
       "3  A3  B3\n",
       "4  A4  B4"
      ]
     },
     "execution_count": 87,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>A1</td>\n",
       "      <td>B1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>A2</td>\n",
       "      <td>B2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>A3</td>\n",
       "      <td>B3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>A4</td>\n",
       "      <td>B4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    A   B\n",
       "1  A1  B1\n",
       "2  A2  B2\n",
       "3  A3  B3\n",
       "4  A4  B4"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.concat([df1, df2],axis=0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 这里也可以使用 axis=0，效果是一样的。但是用 `axis='rows'` 会更直观。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>A1</td>\n",
       "      <td>B1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>A2</td>\n",
       "      <td>B2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>A3</td>\n",
       "      <td>B3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>A4</td>\n",
       "      <td>B4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    A   B\n",
       "1  A1  B1\n",
       "2  A2  B2\n",
       "3  A3  B3\n",
       "4  A4  B4"
      ]
     },
     "execution_count": 89,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.concat([df1,df2],axis=\"rows\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 默认情况下，DataFrame 的合并都是逐行进行的(默认设置是 axis=0)。\n",
    "##### 与np.concatenate() 一样，pd.concat 也可以设置合并坐标轴，例如下面的示例："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>A0</td>\n",
       "      <td>B0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>A1</td>\n",
       "      <td>B1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    A   B\n",
       "0  A0  B0\n",
       "1  A1  B1"
      ]
     },
     "execution_count": 90,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df3 = make_df('AB', [0, 1])\n",
    "df3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>C0</td>\n",
       "      <td>D0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>C1</td>\n",
       "      <td>D1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    C   D\n",
       "0  C0  D0\n",
       "1  C1  D1"
      ]
     },
     "execution_count": 91,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df4 = make_df('CD', [0, 1])\n",
    "df4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>A0</td>\n",
       "      <td>B0</td>\n",
       "      <td>C0</td>\n",
       "      <td>D0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>A1</td>\n",
       "      <td>B1</td>\n",
       "      <td>C1</td>\n",
       "      <td>D1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    A   B   C   D\n",
       "0  A0  B0  C0  D0\n",
       "1  A1  B1  C1  D1"
      ]
     },
     "execution_count": 92,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.concat([df3, df4], axis=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 这里也可以使用 axis=1，效果是一样的。但是用 `axis='columns'` 会更直观。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>A0</td>\n",
       "      <td>B0</td>\n",
       "      <td>C0</td>\n",
       "      <td>D0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>A1</td>\n",
       "      <td>B1</td>\n",
       "      <td>C1</td>\n",
       "      <td>D1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    A   B   C   D\n",
       "0  A0  B0  C0  D0\n",
       "1  A1  B1  C1  D1"
      ]
     },
     "execution_count": 117,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.concat([df3, df4], axis='columns')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2) 类似join的合并\n",
    "#### 看下面两个 DataFrame，它们的列名部分不完全相同："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [],
   "source": [
    "df5 = make_df('ABC', [1, 2])\n",
    "df6 = make_df('BCD', [3, 4])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>A1</td>\n",
       "      <td>B1</td>\n",
       "      <td>C1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>A2</td>\n",
       "      <td>B2</td>\n",
       "      <td>C2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    A   B   C\n",
       "1  A1  B1  C1\n",
       "2  A2  B2  C2"
      ]
     },
     "execution_count": 94,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>B3</td>\n",
       "      <td>C3</td>\n",
       "      <td>D3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>B4</td>\n",
       "      <td>C4</td>\n",
       "      <td>D4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    B   C   D\n",
       "3  B3  C3  D3\n",
       "4  B4  C4  D4"
      ]
     },
     "execution_count": 95,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df6"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>A1</td>\n",
       "      <td>B1</td>\n",
       "      <td>C1</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>A2</td>\n",
       "      <td>B2</td>\n",
       "      <td>C2</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>NaN</td>\n",
       "      <td>B3</td>\n",
       "      <td>C3</td>\n",
       "      <td>D3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>NaN</td>\n",
       "      <td>B4</td>\n",
       "      <td>C4</td>\n",
       "      <td>D4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A   B   C    D\n",
       "1   A1  B1  C1  NaN\n",
       "2   A2  B2  C2  NaN\n",
       "3  NaN  B3  C3   D3\n",
       "4  NaN  B4  C4   D4"
      ]
     },
     "execution_count": 96,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.concat([df5,df6])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>A1</td>\n",
       "      <td>B1</td>\n",
       "      <td>C1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>A2</td>\n",
       "      <td>B2</td>\n",
       "      <td>C2</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>B3</td>\n",
       "      <td>C3</td>\n",
       "      <td>D3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>B4</td>\n",
       "      <td>C4</td>\n",
       "      <td>D4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B    C    B    C    D\n",
       "1   A1   B1   C1  NaN  NaN  NaN\n",
       "2   A2   B2   C2  NaN  NaN  NaN\n",
       "3  NaN  NaN  NaN   B3   C3   D3\n",
       "4  NaN  NaN  NaN   B4   C4   D4"
      ]
     },
     "execution_count": 97,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.concat([df5,df6], axis=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 默认的合并方式是对所有输入列进行并集合并(join='outer')，当然也可以用 join='inner' 实现对输入列的交集合并："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "Empty DataFrame\n",
       "Columns: [A, B, C, B, C, D]\n",
       "Index: []"
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.concat([df5,df6],join=\"inner\",axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>B1</td>\n",
       "      <td>C1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>B2</td>\n",
       "      <td>C2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>B3</td>\n",
       "      <td>C3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>B4</td>\n",
       "      <td>C4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    B   C\n",
       "1  B1  C1\n",
       "2  B2  C2\n",
       "3  B3  C3\n",
       "4  B4  C4"
      ]
     },
     "execution_count": 99,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.concat([df5, df6], axis=0, join='inner')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 另一种合并方式是直接确定结果使用的列名\n",
    "\n",
    "- #pd.concat 的合并功能可以满足你在合并两个数据集时的许多需求，操作时请记住这一点。\n",
    "- [详解pandas数据合并与重塑](https://www.jb51.net/article/164905.htm)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['A', 'B', 'C'], dtype='object')"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df5.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['B', 'C', 'D'], dtype='object')"
      ]
     },
     "execution_count": 101,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df6.columns"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###  1.0.0以后的版本把`join_axes`属性取消掉了，换成了`join`\n",
    "\n",
    "###  [数据拼接](https://blog.csdn.net/Treasure99/article/details/105662654/)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>A1</td>\n",
       "      <td>B1</td>\n",
       "      <td>C1</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>A2</td>\n",
       "      <td>B2</td>\n",
       "      <td>C2</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>NaN</td>\n",
       "      <td>B3</td>\n",
       "      <td>C3</td>\n",
       "      <td>D3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>NaN</td>\n",
       "      <td>B4</td>\n",
       "      <td>C4</td>\n",
       "      <td>D4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A   B   C    D\n",
       "1   A1  B1  C1  NaN\n",
       "2   A2  B2  C2  NaN\n",
       "3  NaN  B3  C3   D3\n",
       "4  NaN  B4  C4   D4"
      ]
     },
     "execution_count": 102,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.concat([df5, df6], join =\"outer\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3) append()方法\n",
    "- 例如，你可以使用 df1.append(df2)，效果与pd.concat([df1, df2]) 一样："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>A1</td>\n",
       "      <td>B1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>A2</td>\n",
       "      <td>B2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    A   B\n",
       "1  A1  B1\n",
       "2  A2  B2"
      ]
     },
     "execution_count": 103,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>A3</td>\n",
       "      <td>B3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>A4</td>\n",
       "      <td>B4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    A   B\n",
       "3  A3  B3\n",
       "4  A4  B4"
      ]
     },
     "execution_count": 104,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>A1</td>\n",
       "      <td>B1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>A2</td>\n",
       "      <td>B2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>A3</td>\n",
       "      <td>B3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>A4</td>\n",
       "      <td>B4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    A   B\n",
       "1  A1  B1\n",
       "2  A2  B2\n",
       "3  A3  B3\n",
       "4  A4  B4"
      ]
     },
     "execution_count": 105,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.append(df2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5 数据透视表和向量化字符串操作\n",
    "### 1)数据透视表\n",
    "#### 示例将采用泰坦尼克号的乘客信息数据库来演示，可以在 Seaborn 程序库获取：\n",
    "[seaborn简单介绍](https://blog.csdn.net/fenfenxhf/article/details/82859620)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# titanic = sns.load_dataset('./data/titanic.csv') #获取在线数据集\n",
    "titanic = pd.read_csv(\"../data/titanic.csv\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 这份数据包含了惨遭厄运的每位乘客的大量信息，包括性别(gender)、年龄(age)、船舱等级(class)和船票价格(fare paid)等。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>survived</th>\n",
       "      <th>pclass</th>\n",
       "      <th>sex</th>\n",
       "      <th>age</th>\n",
       "      <th>sibsp</th>\n",
       "      <th>parch</th>\n",
       "      <th>fare</th>\n",
       "      <th>embarked</th>\n",
       "      <th>class</th>\n",
       "      <th>who</th>\n",
       "      <th>adult_male</th>\n",
       "      <th>deck</th>\n",
       "      <th>embark_town</th>\n",
       "      <th>alive</th>\n",
       "      <th>alone</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>male</td>\n",
       "      <td>22.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>7.2500</td>\n",
       "      <td>S</td>\n",
       "      <td>Third</td>\n",
       "      <td>man</td>\n",
       "      <td>True</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Southampton</td>\n",
       "      <td>no</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>female</td>\n",
       "      <td>38.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>71.2833</td>\n",
       "      <td>C</td>\n",
       "      <td>First</td>\n",
       "      <td>woman</td>\n",
       "      <td>False</td>\n",
       "      <td>C</td>\n",
       "      <td>Cherbourg</td>\n",
       "      <td>yes</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>female</td>\n",
       "      <td>26.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>7.9250</td>\n",
       "      <td>S</td>\n",
       "      <td>Third</td>\n",
       "      <td>woman</td>\n",
       "      <td>False</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Southampton</td>\n",
       "      <td>yes</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>female</td>\n",
       "      <td>35.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>53.1000</td>\n",
       "      <td>S</td>\n",
       "      <td>First</td>\n",
       "      <td>woman</td>\n",
       "      <td>False</td>\n",
       "      <td>C</td>\n",
       "      <td>Southampton</td>\n",
       "      <td>yes</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>male</td>\n",
       "      <td>35.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>8.0500</td>\n",
       "      <td>S</td>\n",
       "      <td>Third</td>\n",
       "      <td>man</td>\n",
       "      <td>True</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Southampton</td>\n",
       "      <td>no</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   survived  pclass     sex   age  sibsp  parch     fare embarked  class  \\\n",
       "0         0       3    male  22.0      1      0   7.2500        S  Third   \n",
       "1         1       1  female  38.0      1      0  71.2833        C  First   \n",
       "2         1       3  female  26.0      0      0   7.9250        S  Third   \n",
       "3         1       1  female  35.0      1      0  53.1000        S  First   \n",
       "4         0       3    male  35.0      0      0   8.0500        S  Third   \n",
       "\n",
       "     who  adult_male deck  embark_town alive  alone  \n",
       "0    man        True  NaN  Southampton    no  False  \n",
       "1  woman       False    C    Cherbourg   yes  False  \n",
       "2  woman       False  NaN  Southampton   yes   True  \n",
       "3  woman       False    C  Southampton   yes  False  \n",
       "4    man        True  NaN  Southampton    no   True  "
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "titanic.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 制作数据透视表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>survived</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sex</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>female</th>\n",
       "      <td>0.742038</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>male</th>\n",
       "      <td>0.188908</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        survived\n",
       "sex             \n",
       "female  0.742038\n",
       "male    0.188908"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "titanic.groupby('sex')[['survived']].mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>class</th>\n",
       "      <th>First</th>\n",
       "      <th>Second</th>\n",
       "      <th>Third</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sex</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>female</th>\n",
       "      <td>0.968085</td>\n",
       "      <td>0.921053</td>\n",
       "      <td>0.500000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>male</th>\n",
       "      <td>0.368852</td>\n",
       "      <td>0.157407</td>\n",
       "      <td>0.135447</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "class      First    Second     Third\n",
       "sex                                 \n",
       "female  0.968085  0.921053  0.500000\n",
       "male    0.368852  0.157407  0.135447"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "titanic.groupby(['sex', 'class'])['survived'].aggregate('mean').unstack()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 用 DataFrame 的 pivot_table 实现的效果等同于上一节的管道命令的代码："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>class</th>\n",
       "      <th>First</th>\n",
       "      <th>Second</th>\n",
       "      <th>Third</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sex</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>female</th>\n",
       "      <td>0.968085</td>\n",
       "      <td>0.921053</td>\n",
       "      <td>0.500000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>male</th>\n",
       "      <td>0.368852</td>\n",
       "      <td>0.157407</td>\n",
       "      <td>0.135447</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "class      First    Second     Third\n",
       "sex                                 \n",
       "female  0.968085  0.921053  0.500000\n",
       "male    0.368852  0.157407  0.135447"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "titanic.pivot_table('survived', index='sex', columns='class')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2)向量化字符串\n",
    "- 下例快速对多个数组元素执行同样的操作，例如："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 2,  3,  5,  7, 11, 13])"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = np.array([2, 3, 5, 7, 11, 13])\n",
    "x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 4,  6, 10, 14, 22, 26])"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x * 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Peter', 'Paul', 'Mary', 'Guido']"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = ['peter', 'Paul', 'MARY', 'gUIDO']\n",
    "[s.capitalize() for s in data]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = ['peter', 'Paul', None, 'MARY', 'gUIDO']\n",
    "##AttributeError Traceback (most recent call last)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    peter\n",
       "1     Paul\n",
       "2     None\n",
       "3     MARY\n",
       "4    gUIDO\n",
       "dtype: object"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#例如，用前面的数据 data 创建了一个 Pandas 的 Series：\n",
    "names = pd.Series(data)\n",
    "names"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "names = names.str.capitalize()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    Peter\n",
       "1     Paul\n",
       "2     None\n",
       "3     Mary\n",
       "4    Guido\n",
       "dtype: object"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "names"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Pandas字符串方法列表\n",
    "### 这一节的示例将采用一些人名来演示："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "monte = pd.Series(['Graham Chapman', 'John Cleese', 'Terry Gilliam','Eric Idle', 'Terry Jones', 'Michael Palin'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    Graham Chapman\n",
       "1       John Cleese\n",
       "2     Terry Gilliam\n",
       "3         Eric Idle\n",
       "4       Terry Jones\n",
       "5     Michael Palin\n",
       "dtype: object"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "monte"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    [Graham, Chapman]\n",
       "1       [John, Cleese]\n",
       "2     [Terry, Gilliam]\n",
       "3         [Eric, Idle]\n",
       "4       [Terry, Jones]\n",
       "5     [Michael, Palin]\n",
       "dtype: object"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "monte.str.split()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 与Python字符串方法相似的方法\n",
    "- 需要注意的是，这些方法的返回值不同，例如 lower() 方法返回一个字符串 Series："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    graham chapman\n",
       "1       john cleese\n",
       "2     terry gilliam\n",
       "3         eric idle\n",
       "4       terry jones\n",
       "5     michael palin\n",
       "dtype: object"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "monte.str.lower()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 但是有些方法返回数值数值："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    14\n",
       "1    11\n",
       "2    13\n",
       "3     9\n",
       "4    11\n",
       "5    13\n",
       "dtype: int64"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "monte.str.len()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 有些方法返回布尔值,可以用来作为过滤条件："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    False\n",
       "1    False\n",
       "2     True\n",
       "3    False\n",
       "4     True\n",
       "5    False\n",
       "dtype: bool"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "filt = monte.str.startswith('T')\n",
    "filt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2    Terry Gilliam\n",
       "4      Terry Jones\n",
       "dtype: object"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "monte[filt]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 还有些方法返回列表或其他复合值："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "monte.str.split()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 补充_seaborn简易教程"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 432x288 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.set_style(\"whitegrid\") #横坐标有标线，纵坐标没有标线，背景白色\n",
    "sns.set_style(\"darkgrid\") #默认，横纵坐标都有标线，组成一个一个格子，背景稍微深色\n",
    "sns.set_style(\"dark\")#背景稍微深色，没有标线线\n",
    "sns.set_style(\"white\")#背景白色，没有标线线\n",
    "sns.set_style(\"ticks\") #xy轴都有非常短的小刻度\n",
    "sns.despine(offset=30,left=True) #去掉上边和右边的轴线，offset=30表示距离轴线（x轴）的距离,left=True表示左边的轴保留"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def sinplot(flip=1): #自定义一个函数\n",
    "    x = np.linspace(0,14,100) #0-14取100个点\n",
    "    for i in range(1,3): #控制画条线\n",
    "        plt.plot(x,np.sin(x + i *0.5) * (7 - i) * flip) #sin函数\n",
    "    plt.show()\n",
    "\n",
    "sinplot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "with sns.axes_style(\"darkgrid\"): #with里面的用一种背景风格\n",
    "    plt.subplot(211)\n",
    "    sinplot()\n",
    "plt.subplot(212)\n",
    "sinplot(-1)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAj8AAABICAYAAAAZFJRnAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAACtUlEQVR4nO3csWoUURiG4bNRYoqkiIhYCVFMldSCoCheQSpB78LGdrGxsxE7O6sRzB1ov72IRFCbgIK6YBrB4HgBAcOCJ8eZ73nKzQS+v8oLE3bS931fAABCLLUeAABwksQPABBF/AAAUcQPABBF/AAAUcQPABDl9HEPdF1Xuq4rpZTy5t370q+drz6qle2lj60nVPV2ebn1hGoufR73NzYcrF1sPaGq34dfWk+o6uyZC60nVPV16aD1hGpWV7+1nlDVh3K59YSqzv34Xmaz2ZHPJ4t8z8+Vq7fLr1v3/+mw/8mnlbutJ1S1vTHeP6AvHh22nlDV65tPW0+o6uf8cesJVd3ZeNB6QlXPVl61nlDN9RvPW0+o6t7kZesJVV178rDs7u4e+dxrLwAgivgBAKKIHwAgivgBAKKIHwAgivgBAKKIHwAgivgBAKKIHwAgivgBAKKIHwAgivgBAKKIHwAgivgBAKKIHwAgivgBAKKIHwAgivgBAKKIHwAgivgBAKKIHwAgivgBAKKIHwAgivgBAKKIHwAgivgBAKKIHwAgivgBAKKIHwAgivgBAKKIHwAgivgBAKKIHwAgivgBAKKIHwAgivgBAKKIHwAgivgBAKKIHwAgivgBAKKIHwAgivgBAKKIHwAgivgBAKKIHwAgivgBAKKIHwAgivgBAKKIHwAgivgBAKKIHwAgivgBAKJM+r7v//ZA13Wl67pSSil7e3tlc3PzRIa1MJ/Py/r6eusZVYz5tlLcN3TuG64x31aK+4Zuf3+/zGazoz/oF7Czs7PI44Mz5vvGfFvfu2/o3DdcY76t7903Vl57AQBRxA8AEOXUdDqdLvILW1tblab8H8Z835hvK8V9Q+e+4RrzbaW4b4yO/YdnAIAx8doLAIgifgCAKOIHAIgifgCAKOIHAIjyB5tqR83uQVkzAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 720x72 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "current_palette1 = sns.color_palette()\n",
    "sns.palplot(current_palette1)\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAq8AAABICAYAAADYvxyOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAACsElEQVR4nO3coY4TURTH4dMFsSSLqEcXsyQEuw6L6pPwCn0FHmPwWBQrNhgwS2iCrMFsAis2mMsLNCxNGG7/N99nZ5qcI27ym2baRWutFQAABDjpPQAAAPwt8QoAQAzxCgBADPEKAEAM8QoAQAzxCgBAjIf33TBNU03TVFVV375c15NHp7MP1c3j3gPMq531nmA+P3oPMLPb4Z8zHb5ogx/Ak9veE8xn8JNXZzX6v4GOe/i+//pZH68/7722OOR/Xl+9eF5vnj39Z4MdnZe9B5jX3UXvCebzvvcAM7usgR8aq8rhCzf4ATy97D3BfAY/eXVRd71HmNm4h+/117f17tOHvddG/zoHAICBiFcAAGKIVwAAYohXAABiiFcAAGKIVwAAYohXAABiiFcAAGKIVwAAYohXAABiiFcAAGKIVwAAYohXAABiiFcAAGKIVwAAYohXAABiiFcAAGKIVwAAYohXAABiiFcAAGKIVwAAYohXAABiiFcAAGKIVwAAYohXAABiiFcAAGKIVwAAYohXAABiiFcAAGKIVwAAYohXAABiiFcAAGKIVwAAYohXAABiiFcAAGKIVwAAYohXAABiiFcAAGKIVwAAYohXAABiiFcAAGKIVwAAYohXAABiiFcAAGKIVwAAYohXAABiiFcAAGKIVwAAYohXAABiiFcAAGKIVwAAYohXAABiLFpr7U83TNNU0zRVVdV2u63VavVfBuvh5uamlstl7zFmMfJuVfZLZ79cI+9WZb909su12+3q6upq/8V2gPV6fcjtcUbeb+TdWrNfOvvlGnm31uyXzn5j8toAAAAxxCsAADEebDabzSEfOD8/n2mU4zDyfiPvVmW/dPbLNfJuVfZLZ7/x3PuDLQAAOBZeGwAAIIZ4BQAghngFACCGeAUAIIZ4BQAgxm8lnAEfDw040gAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 864x72 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "current_palette2 = sns.color_palette(\"hls\",12)  #就是这里传参数，一般使用“hls”,l是亮度，s是饱和度,12表示12种颜色\n",
    "sns.palplot(current_palette2)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 2.00480562,  1.00054129,  1.4427566 ,  2.49510273,  2.28865093,\n",
       "         3.41374538,  3.11930383,  2.94754647,  4.51057317,  4.37026671,\n",
       "         5.50957377,  5.83334611],\n",
       "       [-0.09480324, -0.79399604,  1.22986453,  1.05161751,  0.40019732,\n",
       "         2.7686651 ,  3.37945758,  2.24849775,  3.65300036,  4.91673547,\n",
       "         4.84741631,  4.55428578],\n",
       "       [ 0.86876368,  0.79943142, -0.9381063 ,  1.42736753,  2.72379906,\n",
       "         3.55077811,  3.4144772 ,  3.39447095,  3.23696282,  3.91203992,\n",
       "         4.90048141,  3.97809899],\n",
       "       [-2.39687229,  1.51701034,  0.65659295,  2.60087681,  1.36940981,\n",
       "         1.84601681,  3.41894025,  4.43788461,  3.30980217,  4.9169137 ,\n",
       "         4.92774254,  4.76711989],\n",
       "       [ 0.37600753,  1.54899395,  2.33062819,  1.06066029,  2.48706548,\n",
       "         2.13399895,  3.86884073,  3.9691116 ,  3.70862298,  3.07531432,\n",
       "         6.87796889,  5.89685125],\n",
       "       [ 0.4506561 , -0.17114403,  0.97543672,  1.0511274 ,  1.8824052 ,\n",
       "         3.3426687 ,  3.799356  ,  2.75327173,  3.98058358,  4.89693257,\n",
       "         3.96793903,  4.85272139],\n",
       "       [ 0.51414516,  0.27942044,  0.83167744,  1.56741956,  2.23381051,\n",
       "         1.21042359,  3.85533767,  4.15301098,  3.60283972,  3.00699459,\n",
       "         6.16406772,  4.26517906],\n",
       "       [-1.43249034, -0.1837912 , -0.25298837,  1.04506594,  1.01143685,\n",
       "         1.54402502,  2.88242254,  4.56073621,  6.38673966,  4.4534297 ,\n",
       "         4.0027246 ,  5.85135256],\n",
       "       [-0.76805793,  0.69983337,  1.15875956,  0.47658624,  1.53645664,\n",
       "         2.36452885,  4.84930673,  3.09349581,  4.59247202,  6.49825266,\n",
       "         3.62940097,  5.78229014],\n",
       "       [ 0.08377236, -0.77736641,  1.62126979,  1.53331839,  3.40303003,\n",
       "         2.88452724,  2.62075883,  1.26184305,  4.3365111 ,  4.09621515,\n",
       "         5.84050669,  5.6557849 ],\n",
       "       [ 0.58650489,  0.51933899,  0.19663068, -0.23029622,  1.57718005,\n",
       "         2.16141318,  3.05557912,  2.94377354,  3.96542748,  4.10165278,\n",
       "         3.15072129,  6.06837246],\n",
       "       [-1.85292392,  1.08640651, -1.42994752,  0.18863945,  2.252501  ,\n",
       "         3.12797417,  1.53760181,  3.14045108,  4.93424443,  4.485975  ,\n",
       "         5.08851604,  5.11405062],\n",
       "       [ 0.645966  , -0.71277503,  0.60958943,  1.56527387,  1.66651956,\n",
       "         2.36679567,  2.21859781,  3.96276387,  4.23098428,  6.01633006,\n",
       "         6.57147272,  6.96776998],\n",
       "       [ 0.59100743,  1.59566312,  1.08508414,  3.72477258,  2.96508545,\n",
       "         1.43162629,  3.89871833,  3.47214731,  4.7301034 ,  3.97676591,\n",
       "         4.28749377,  4.32179964],\n",
       "       [-1.8198161 ,  1.90574008,  1.14111125,  1.53252038,  1.22959019,\n",
       "         1.26137593,  3.46767793,  4.44865249,  3.64219542,  5.02738135,\n",
       "         5.16620227,  6.20578831],\n",
       "       [-0.58801752, -0.24393127,  0.27230959,  0.58056318,  1.30587551,\n",
       "         3.46300618,  2.16496394,  5.07259236,  3.50079429,  4.73108428,\n",
       "         4.23379431,  6.10833938],\n",
       "       [ 2.27101117,  2.65011806,  1.82678398,  1.87226786,  3.3518528 ,\n",
       "         1.34653248,  3.28087649,  4.93279467,  3.30092918,  4.19458194,\n",
       "         4.89835635,  6.29871813],\n",
       "       [-1.01119828,  1.56900993,  1.45903397,  4.12545082,  2.02135122,\n",
       "         0.88757672,  4.93939019,  3.34523775,  3.69976872,  3.09374157,\n",
       "         3.67896072,  7.31083189],\n",
       "       [-1.55353457,  0.4332824 ,  0.27915032,  2.22293863,  3.3117227 ,\n",
       "         2.07056848,  2.99182394,  4.64322961,  4.25314663,  3.76578713,\n",
       "         4.5411278 ,  6.25888733],\n",
       "       [-0.07512795,  0.75093206, -0.21574518,  0.49016341,  0.94154569,\n",
       "         2.92250628,  4.15122336,  1.82416019,  2.90590428,  4.53862405,\n",
       "         4.9477861 ,  5.42141536]])"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "current_palette2 = sns.color_palette(\"hls\",12)\n",
    "data = np.random.normal(size=(20,12)) + np.arange(12) / 2 #随机生成的数据\n",
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.boxplot(data=data,palette=current_palette2) #使用颜色就是传递参数给palette\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
